

#define maxv 1000
int n,m;
/*********匈牙利模板***************************/
int visit[maxv],pre[maxv];
int next[maxv*maxv*2],first[maxv];
int Ef[maxv*maxv*2],E[maxv*maxv*2];
int M,cal;;

bool can(int t)
{
    int i,j;
    i=first[t];
    for(; i!=-1;  i=next[i])
    {
         if(visit[E[i]]<cal)
         {
            visit[E[i]]=cal;
            if(pre[E[i]]==-1 || can(pre[E[i]]))
            {
                pre[E[i]]=t;
                return 1;
            }
         }

    }
    return 0;
}

void init()
{
	M=-1;
    memset(pre,-1,sizeof(pre));
    memset(first,-1,sizeof(first));
}
void insert(int i,int t)
{
	M++;
	next[M]=first[i];
    first[i]=M;
    Ef[M]=i;
    E[M]=t;
}

int solve(int n)
{
	int res=0,i;
	//之用for一边的点就够了
	 for(i=1; i<=n; i++)//只用考虑一边，n为左边点的数目
    {//点的标号无所谓，但是一定要注意就是要搜遍左边所有点
       cal++;//对visit清零操作
        if(can(i))  res++;
    }
       return res;
}
/*********匈牙利模板***************************/

int g[maxv][maxv];
int main()
{
#ifndef ONLINE_JUDGE
	freopen("in","r",stdin);
#endif
    int i,j,k;
    int t,nn,mm,cas=0;
    while(scanf("%d%d%d", &nn,&mm, &t),nn||mm||t)
    {
    	int cal=0;
    	printf("Case %d: ",++cas);
    	memset(g,0,sizeof(g));
    	for(i=1; i<=nn;i ++)
    	for(j=1; j<=nn;j++)
			g[i][j]=g[j][i]=1;
		for(i=1; i<=mm;i ++)
    	for(j=1; j<=mm;j++)
    		g[i+nn][j+nn]=g[j+nn][i+nn]=1;
    /*********匈牙利模板***************************/
		init();
	/*********匈牙利模板***************************/
		int a,b;
		for(i=0; i<t; i++)
		{
			scanf("%d%d",&a,&b);
			g[a][b+nn]=g[b+nn][a]=1;
		}
		n=nn+mm;
        for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
        if(g[i][j]==0)
       	{
    /*********匈牙利模板***************************/
	//注意连边 左边点从1到n，右边点从1到m也可以是n+1到n+m (n和m可以不相同)
       		insert(i,j);
    /*********匈牙利模板***************************/
       	}
        int res=0;
      /*********匈牙利模板***************************/
       res=solve(nn);//传入左边点的数目
     /*********匈牙利模板***************************/
        printf("%d\n", n-res);
    }

}
